package com.ekgc.addressbook.base.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.fasterxml.jackson.databind.json.JsonMapper;

import java.security.PublicKey;
import java.util.HashMap;
import java.util.Map;

/**
 * <b>基础功能 -- Token 工具</b>
 *
 * @author FanSheng
 * @version 1.0
 */
public class TokenUtil {
	private static final Algorithm ALGORITHM = Algorithm.HMAC256(BaseConstant.TOKEN_SECRET_KEY);
	private static final Map<String, Object> HEADER_MAP = new HashMap<>();
	private static final String PAYLOAD_KEY = "payload";

	static {
		HEADER_MAP.put("typ", BaseConstant.TOKEN_HEADER_TYP);
		HEADER_MAP.put("alg", BaseConstant.TOKEN_HEADER_ALG);
	}

	/**
	 * <b>生成 Token 信息</b>
	 * @param payload
	 * @return
	 */
	public static String createToken(Object payload) {
		// 创建用于生成 Token 的 Builder 对象
		JWTCreator.Builder builder = JWT.create();

		// 设置 Token 的 Header 信息
		builder.withHeader(HEADER_MAP);

		// 设置 Token 的 payload 信息
		try{
			String payloadJson = new JsonMapper().writeValueAsString(payload);
			builder.withClaim(PAYLOAD_KEY, payloadJson);

			// 对创建好的 Token 进行签名
			return builder.sign(ALGORITHM);
		}catch (Exception e){
			throw new RuntimeException(e.getMessage());
		}
	}

	/**
	 * <b>校验 Token 是否正确</b>
	 * @param token
	 * @return
	 */
	public static boolean verifyToken(String token) {
		// 创建 Token 校验对象
		JWTVerifier verifier = JWT.require(ALGORITHM).build();

		try {
			verifier.verify(token);
			return true;
		}catch (Exception e){
			return false;
		}

	}
}
